// Copyright 2021 by 马万里. All rights reserved.
// 开发团队 ：   鸡中之霸
// 开发人员 ：   马万里
// 开发时间 ：   2021/2/27 01:45
// 文件名称 ：   producer.go
// 工程名称 ：   netpan
// 开发工具 ：   GoLand
//

package mq

import (
	"github.com/streadway/amqp"
	"johnsonsmile.cn/netpan/config"
	"log"
)

var conn *amqp.Connection
var channel *amqp.Channel

// 如果异常关闭，会接收通知
var notifyClose chan *amqp.Error

func init() {
	if !config.AsyncTransferEnable {
		return
	}
	if initChannel() {
		channel.NotifyClose(notifyClose)
	}

	// 断线自动重连
	go func() {
		for {
			select {
			case msg := <-notifyClose:
				conn = nil
				channel = nil
				log.Printf("onNotifyChannelClosed: %+v\n", msg)
				initChannel()
			}
		}
	}()
}

func initChannel() bool {

	// 1. 判断是否已经创建
	if channel != nil {
		return true
	}

	// 2. 获得连接
	rConn, err := amqp.Dial(config.RabbitURL)
	if err != nil {
		log.Println(err.Error())
		return false
	}

	// 3. 打开一个channel,用于下次的发布与接收
	channel, err = rConn.Channel()
	if err != nil {
		log.Println(err.Error())
		return false
	}
	return true
}

// Publish: 发布消息
func Publish(exchange, routingKey string, msg []byte) bool {
	// 1. 检查channel
	if !initChannel() {
		return false
	}

	// 2. 发布消息
	err := channel.Publish(
		exchange,
		routingKey,
		false, // 是否返回给发布者,没有队列接收的话
		false,
		amqp.Publishing{
			ContentType: "text/plain",
			Body:        msg,
		})
	if err != nil {
		return false
	}
	return true
}
